/**
 * @file extraDataBlockControl.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2025-04-29
 *
 * @copyright Copyright (c) 2025
 *
 */

#include "extraDataBlockControl.h"

#include <string.h>

/**
 * 同步版本 READ_DBL（立即完成数据块拷贝）
 */
Bool READ_DBL(
    Bool en,
    Bool REQ,
    void *SRCBLK,
    size_t SRC_LEN,
    Int *RET_VAL,
    Bool *BUSY,
    void *DSTBLK,
    size_t DST_LEN

) {
    if (BUSY) *BUSY = false;      // 同步版本：任务不挂起

    if (!en) {
        if (RET_VAL) *RET_VAL = READ_DBL_EN_DISABLED;  // 7000
        return false;
    }

    if (!REQ) {
        if (RET_VAL) *RET_VAL = READ_DBL_REQ_LOW;      // 7001
        return false;
    }

    // 参数校验（模拟目标 DB 不存在）
    if (!SRCBLK || !DSTBLK || !RET_VAL || SRC_LEN == 0 || DST_LEN == 0) {
        *RET_VAL = READ_DBL_PARAM_ERROR;               // 8093
        return false;
    }

    // 正常拷贝
    if (SRC_LEN > DST_LEN) {
        memcpy(DSTBLK, SRCBLK, DST_LEN);
        *RET_VAL = READ_DBL_SRC_GT_DST;                // 8081
    } else if (SRC_LEN < DST_LEN) {
        memcpy(DSTBLK, SRCBLK, SRC_LEN);
        *RET_VAL = READ_DBL_DST_GT_SRC;                // 0081
    } else {
        memcpy(DSTBLK, SRCBLK, SRC_LEN);
        *RET_VAL = READ_DBL_OK;                        // 0000
    }

    return true;
}


Bool WRIT_DBL(
    Bool en,
    Bool REQ,
    void *SRCBLK,
    size_t SRC_LEN,
    Int *RET_VAL,
    Bool *BUSY,
    void *DSTBLK,
    size_t DST_LEN
) {
    if (BUSY) *BUSY = false;   // 同步：立即完成

    if (!en) {
        if (RET_VAL) *RET_VAL = WRIT_DBL_EN_FALSE;  // 7000
        return false;
    }

    if (!REQ) {
        if (RET_VAL) *RET_VAL = WRIT_DBL_REQ_LOW;   // 7001
        return false;
    }

    if (!SRCBLK || !DSTBLK || !RET_VAL || SRC_LEN == 0 || DST_LEN == 0) {
        *RET_VAL = WRIT_DBL_PARAM_ERROR;            // 8093
        return false;
    }

    // 模拟写保护或空间不足（按需添加真实检查）
    // 示例：if (is_write_protected(DSTBLK)) { *RET_VAL = WRIT_DBL_WRITE_PROTECT; return false; }

    if (SRC_LEN > DST_LEN) {
        memcpy(DSTBLK, SRCBLK, DST_LEN);
        *RET_VAL = WRIT_DBL_SRC_GT_DST;             // 8081
    } else if (SRC_LEN < DST_LEN) {
        memcpy(DSTBLK, SRCBLK, SRC_LEN);
        *RET_VAL = WRIT_DBL_DST_GT_SRC;             // 0081
    } else {
        memcpy(DSTBLK, SRCBLK, SRC_LEN);
        *RET_VAL = WRIT_DBL_OK;                     // 0000
    }

    return true;
}
